/**
 * 通过调用interface提供的基本物理接口实现读写rc522寄存器的功能
 * 基本物理接口指gpio，spi，i2c等
*/
#include "interface.h"
#include <stdint.h>

/*
 * @brief 读取寄存器
 * @param addr 寄存器地址
 * @return 返回寄存器数据
 */
uint8_t read_reg(uint8_t addr)
{
	uint8_t data;

	// 低电平选中设备
	rc522_spi_set_cs(0);

	/*
         * 根据手册将最高位设置为1表示读数据，最低位要求设置为0
         */
	addr <<= 1;
	addr |= 0x80;

	rc522_spi_write(&addr, 1);
	rc522_spi_read(&data, 1);

	rc522_spi_set_cs(1);

	return data;
}

/*
 * @brief 写入寄存器
 * @param addr 寄存器地址
 * @param data 欲写入数据
 * 
 */
void write_reg(uint8_t addr, uint8_t data)
{
	// 低电平选中设备
	rc522_spi_set_cs(0);

	/*
         * 根据手册将最高位设置为0表示写数据，最低位要求设置为0
         */
	addr <<= 1;
	addr &= 0x7e;

	rc522_spi_write(&addr, 1);
	rc522_spi_write(&data, 1);

	rc522_spi_set_cs(1);
}

/*
 * @brief 置RC522寄存器位
 * @param reg 寄存器地址
 * @param mask 置位值
 * @return 无
*/
void set_bit_mask(uint8_t reg, uint8_t mask)
{
	char t = 0x00;
	t = read_reg(reg) | mask;

	// set bit mask
	write_reg(reg, t);
}

/*
 * @brief 清RC522寄存器位
 * @param reg 寄存器地址
 * @param mask 清位值
 * @return 无
*/
void clear_bit_mask(uint8_t reg, uint8_t mask)
{
	char t = 0x00;
	t = read_reg(reg) & (~mask);

	// clear bit mask
	write_reg(reg, t);
}